; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================
; KERNEL

BITS 16

%include "macrosmodoreal.mac"
%include "macrosmodoprotegido.mac"

%define KORG 0x1200

%define PAGE_DIRECTORY 0xA000

global start
extern tsss
extern gdt
extern GDT_DESC
extern IDT_DESC
extern inicializar_idt

extern resetear_pic
extern habilitar_pic


; PUNTO DE ENTRADA DEL KERNEL
start:
		cli ;pues que no me interrumpan por ahora
		jmp bienvenida

		;aca ponemos todos los mensajes
		iniciando: db 'Iniciando el kernel'
		iniciando_len equ $ - iniciando
		nombre_grupo: db 'Grupo Fidel Castro',0
		nombre_grupo_len equ $-nombre_grupo






bienvenida:
		IMPRIMIR_MODO_REAL iniciando, iniciando_len, 0x07, 0, 0

		;xchg bx, bx

		; habilitar A20
		call habilitar_A20
		; dehsabilitar las interrupciones
		cli
		; cargar la GDT
		lgdt [GDT_DESC]
               
		; setear el bit PE del registro CR0
		mov eax, cr0
		or eax, 1
		mov cr0, eax
       
		; pasar a modo protegido
		jmp 1010000b:mp
BITS 32
mp:
		; acomodar los segmentos
		mov ax, 1011000b
		mov ds, ax
		mov gs, ax
		mov ss, ax
		mov ax,  1110000b
		mov fs, ax  		; segmento de video
		; seteo la pila
		mov ebp, 0x20000
		mov esp, ebp
		; pintar pantalla, todos los colores, que bonito!
		mov ax, 0x0F20
		mov ecx, 80
		xor ebx, ebx
		ciclo_pantalla:
		mov [fs:ebx], ax
		add ebx, 2
		loop ciclo_pantalla
	
		mov ecx, 1840
		mov ax, 0x9E20
		mov ebx, 160
		ciclo_pantalla_centro:
		mov [fs:ebx], ax
		add ebx, 2
		loop ciclo_pantalla_centro


		IMPRIMIR_TEXTO nombre_grupo, nombre_grupo_len, 0xF, 0, 1

		; inicializar el manejador de memoria

		; inicializar el directorio de paginas
		call page_init
		mov eax, 0x100000
		mov cr3, eax

		mov eax, cr0				
		or  eax, 0x80000000		;habilito paginacion
		mov cr0, eax

		; inicializar memoria de tareas

		; habilitar paginacion

		; inicializar tarea idle

		; inicializar todas las tsss

		; inicializar entradas de la gdt de tss

		; inicializar el scheduler

		; inicializar la IDT
		call inicializar_idt
		xchg bx, bx

		; configurar controlador de interrupciones

		; cargo la primer tarea null

		; aca salto a la primer tarea (Idle)

		jmp $

%include "a20.asm"
%include "paging.asm"

